#!/bin/bash
# 改进的Dumbo_NG启动脚本
# 基于实际部署经验，解决常见问题

set -euo pipefail

# 配置参数
NODE_ID="${1:-0}"
LOG_LEVEL="${2:-4}"
BATCH_SIZE="${3:-5000}"

echo "=== 改进的Dumbo_NG启动脚本 ==="
echo "节点ID: $NODE_ID"
echo "日志级别: $LOG_LEVEL"
echo "批次大小: $BATCH_SIZE"

# 1. 设置Go环境变量
echo "=== 设置Go环境 ==="
export GOROOT="/usr/local/go"
export GOPATH="/home/go"
export PATH="/usr/local/go/bin:$PATH"

# 验证Go环境
if ! command -v go &> /dev/null; then
    echo "❌ Go环境未正确配置"
    exit 1
fi
echo "✅ Go环境: $(go version)"

# 2. 彻底清理旧进程和端口
echo "=== 清理旧进程和端口 ==="
pkill -f "main run" || true
sleep 2

# 清理端口
for port in 9000 9001 9002 9003; do
    fuser -k -n tcp $port 2>/dev/null || true
    pid=$(ss -ltnp 2>/dev/null | awk -v prt=":$port" '$0 ~ prt {print $NF}' | sed -n 's/.*pid=\([0-9]\+\).*/\1/p' | head -n1)
    [ -n "${pid:-}" ] && kill -9 "$pid" 2>/dev/null || true
done
sleep 1

# 3. 创建必要的目录结构
echo "=== 创建目录结构 ==="
cd /home/Dumbo_NG
mkdir -p logs "logs/node-${NODE_ID}"

# 4. 清理旧数据存储，避免NutsDB bucket冲突
echo "=== 清理旧数据 ==="
rm -rf "db-${NODE_ID}"*

# 使用时间戳避免bucket冲突
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
STORE_PATH="db-${NODE_ID}-${TIMESTAMP}"
mkdir -p "$STORE_PATH"

# 5. 确保配置文件存在
echo "=== 检查配置文件 ==="
REQUIRED_FILES=(
    ".node-key-${NODE_ID}.json"
    ".node-ts-key-${NODE_ID}.json"
    ".committee.json"
    ".parameters.json"
)

for file in "${REQUIRED_FILES[@]}"; do
    if [ ! -f "$file" ]; then
        echo "❌ 缺少配置文件: $file"
        exit 1
    fi
    echo "✅ 配置文件存在: $file"
done

# 6. 启动Dumbo_NG节点
echo "=== 启动Dumbo_NG节点 $NODE_ID ==="
nohup ./main run \
    --keys ".node-key-${NODE_ID}.json" \
    --threshold_keys ".node-ts-key-${NODE_ID}.json" \
    --committee ".committee.json" \
    --parameters ".parameters.json" \
    --store "$STORE_PATH" \
    --log_out "logs/node-${NODE_ID}" \
    --log_level "$LOG_LEVEL" \
    --node_id "$NODE_ID" \
    > "logs/node-${NODE_ID}/out.log" 2>&1 &

PID=$!
echo "Dumbo_NG节点 $NODE_ID 启动完成，PID: $PID"
echo "$PID" > "logs/node-${NODE_ID}/pid.txt"

# 7. 等待启动并验证
echo "=== 等待启动完成 ==="
sleep 5

# 8. 验证启动状态
echo "=== 验证启动状态 ==="
if pgrep -f "main run" > /dev/null; then
    echo "✅ Dumbo_NG进程正在运行"
    ps aux | grep "main run" | grep -v grep
else
    echo "❌ Dumbo_NG进程未运行"
    exit 1
fi

# 检查端口监听
PORT=$((9000 + NODE_ID))
if ss -ltnp | grep ":${PORT}" > /dev/null; then
    echo "✅ 端口${PORT}正在监听"
    ss -ltnp | grep ":${PORT}"
else
    echo "❌ 端口${PORT}未监听"
fi

# 9. 检查日志文件
echo "=== 检查日志文件 ==="
LOG_DIR="logs/node-${NODE_ID}"
if [ -d "$LOG_DIR" ]; then
    echo "日志目录内容:"
    ls -la "$LOG_DIR/"
    
    # 检查各个日志文件
    for log_file in "$LOG_DIR/out.log" "$LOG_DIR/node-info-${NODE_ID}.log" "$LOG_DIR/node-debug-${NODE_ID}.log" "$LOG_DIR/node-error-${NODE_ID}.log"; do
        if [ -f "$log_file" ]; then
            size=$(wc -c < "$log_file")
            lines=$(wc -l < "$log_file")
            echo "  $log_file: ${size}字节, ${lines}行"
            if [ $size -gt 0 ]; then
                echo "    最后10行内容:"
                tail -10 "$log_file" | sed 's/^/      /'
            fi
        else
            echo "  $log_file: 不存在"
        fi
    done
fi

echo "=== Dumbo_NG节点 $NODE_ID 启动完成 ==="










